home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / CLP2GMI.ASM < prev    next >
Assembly Source File  |  1986-06-11  |  17KB  |  447 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = PIC2IMG.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. IMG           DB      'GMI',0
  11. PIC           DB      'CLP'
  12. FILENAME       DB      128 DUP(0)
  13. HANDLE_IN      DW      0
  14. HANDLE_OUT     DW      0
  15. TYPE_FROM      DW      0
  16.  
  17. LINES_PER_READ DW      0
  18. READS_PER_FILE DW      0
  19. BYTES_PER_READ DW      0
  20.  
  21. DISK_BUFFER    DD      0
  22.  
  23. ;44 BYTES
  24. IMG_NAME       DB      'FILE GENERATED FROM PCPAINT   '
  25. IMG_HEIGHT     DW      0
  26. IMG_WIDTH      DW      0
  27. IMG_WIDTH_BYTE DW      0
  28. IMG_PIX_SIZE   DW      1
  29. IMG_PIX_FMT    DW      0
  30. IMG_COLOR      DW      0
  31. IMG_COMPRESS   DW      0
  32.  
  33.  
  34. CLP_PAC_SZ     DW      0
  35. CLP_WIDTH      DW      0               ;WIDTH OF IMAGE
  36. CLP_HEIGHT     DW      0               ;HEIGHT OF IMAGE
  37. CLP_X_OFF      DW      0               ;X OFFSET OF PIC
  38. CLP_Y_OFF      DW      0               ;Y OFFSET OF PIC
  39. CLP_2           DB      0FFH               ;PCPAINT 2.0
  40. CLP_PIX_SIZE   DB      1               ;SIZE OF PEL
  41. CLP_ID           DB      0               ;IDENTIFIER
  42. CLP_NORM       DW      0
  43.  
  44. EIGHT           DW      8
  45.  
  46. TELL_HOW       DB      '┌──────────────────────────────────────────────┐',cr,lf
  47.            DB      '│ CLP2GMI filename.typ                         │',cr,lf
  48.            DB      '├──────────────────────────────────────────────┤',cr,lf
  49.            DB      '│ filename = PC-Paint Plus filename            │',cr,lf
  50.            DB      '│ typ      = must end in PIC                   │',cr,lf
  51.            DB      '├──────────────────────────────────────────────┤',cr,lf
  52.            DB      '│ Converts CLP file to reverse IMG file (GMI)  │',cr,lf
  53.            DB      '│ (top scan line on bottom)                    │',cr,lf
  54.            DB      '└──────────────────────────────────────────────┘',cr,lf
  55.            DB      7,'$'
  56. OPEN_ERROR     DB      'file not found...must end in CLP',cr,lf,'$'
  57. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  58. ;╔═════════════════════════════════════════════════════════════════════════════╗
  59. ;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  60. ;╚═════════════════════════════════════════════════════════════════════════════╝
  61. MAIN           PROC    FAR
  62. ;┌─────────────────────────────────────────────────────────────────────────────┐
  63. ;│           RETURN SETUP                               │
  64. ;└─────────────────────────────────────────────────────────────────────────────┘
  65.            CLI
  66.            MOV     AX,CS               ;TEMP STACK
  67.            MOV     SS,AX               ;
  68.            MOV     ES,AX               ;
  69.            MOV     SP,OFFSET STACK           ;
  70.            STI
  71.            PUSH    DS               ;
  72.            XOR     AX,AX               ;
  73.            PUSH    AX               ;
  74.            CLD
  75. ;┌─────────────────────────────────────────────────────────────────────────────┐
  76. ;│           GET FILENAME FROM COMMAND LINE                       │
  77. ;└─────────────────────────────────────────────────────────────────────────────┘
  78.            MOV     SI,82H               ;START OF FILENAME
  79.            XOR     CH,CH               ;
  80.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  81.            CMP     CX,0               ;NO COMMANDS
  82.            JE      GFN800               ;ERROR
  83.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  84. GFN100:
  85.            LODSB                   ;GET CHARACTER
  86.            CMP     AL,20H               ;END OF FILENAME?
  87.            JE      GFN900               ;YES....BRANCH
  88.            CMP     AL,CR               ;END OF COMMAND LINE?
  89.            JE      GFN900               ;YES....ERROR
  90.            STOSB                   ;SAVE CHARACTER
  91.            CMP     AL,'.'                  ;START OF TYPE
  92.            JNE     GFN200               ;
  93.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  94. GFN200:
  95.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  96.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  97. GFN800:
  98.            MOV     DX,OFFSET TELL_HOW      ;
  99.            JMP     ERROR               ;
  100. GFN900:
  101.            MOV     AL,0               ;PUT NULL AT END OF STRING
  102.            STOSB                   ;
  103.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  104.            JNE     SET_BREAK
  105.            DEC     DI
  106.            MOV     CS:TYPE_FROM,DI
  107. ;┌─────────────────────────────────────────────────────────────────────────────┐
  108. ;│           TURN BREAK KEY ON                           │
  109. ;└─────────────────────────────────────────────────────────────────────────────┘
  110. SET_BREAK:
  111.            MOV     AX,CS               ;SET DATA SEGMENT
  112.            MOV     DS,AX               ;
  113.            CALL    BREAK_ON            ;SET UP CONTROL BREAK
  114. ;┌─────────────────────────────────────────────────────────────────────────────┐
  115. ;│           FIND DISK MEMORY                            │
  116. ;└─────────────────────────────────────────────────────────────────────────────┘
  117.            MOV     AX,OFFSET PROG_END      ;
  118.            MOV     BX,CS               ;
  119.            SHR     AX,1               ;
  120.            SHR     AX,1               ;
  121.            SHR     AX,1               ;
  122.            SHR     AX,1               ;
  123.            ADD     BX,AX               ;
  124.            ADD     BX,8               ;
  125.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  126. ;┌─────────────────────────────────────────────────────────────────────────────┐
  127. ;│           CHECK  FILENAME                               │
  128. ;└─────────────────────────────────────────────────────────────────────────────┘
  129.            MOV     SI,OFFSET PIC           ;CHANGE TYPE ON FILENAME
  130.            MOV     DI,TYPE_FROM           ;
  131.            MOV     CX,3               ;
  132.            AND     BYTE PTR [DI],0DFH        ;MAKE CAPITOL LETTER
  133.            AND     BYTE PTR [DI+1],0DFH        ;MAKE CAPITOL LETTER
  134.            AND     BYTE PTR [DI+2],0DFH        ;MAKE CAPITOL LETTER
  135.            REP     CMPSB               ;
  136.            JNE     OIF050
  137. ;┌─────────────────────────────────────────────────────────────────────────────┐
  138. ;│           OPEN INPUT FILE                               │
  139. ;└─────────────────────────────────────────────────────────────────────────────┘
  140.            MOV     AH,3DH               ;OPEN FILE FOR READ
  141.            MOV     AL,0H               ;
  142.            MOV     DX,OFFSET FILENAME      ;
  143.            INT     21H               ;
  144.            JNC     OIF100
  145. OIF050:
  146.            MOV     DX,OFFSET OPEN_ERROR    ;
  147.            JMP     ERROR
  148. OIF100:
  149.            MOV     HANDLE_IN,AX
  150. ;┌─────────────────────────────────────────────────────────────────────────────┐
  151. ;│           CHANGE FILENAME                               │
  152. ;└─────────────────────────────────────────────────────────────────────────────┘
  153.            MOV     SI,OFFSET IMG           ;CHANGE TYPE ON FILENAME
  154.            MOV     DI,TYPE_FROM           ;
  155.            MOV     CX,3               ;
  156.            REP     MOVSB               ;
  157. ;┌─────────────────────────────────────────────────────────────────────────────┐
  158. ;│           CREATE OUTPUT TEMP FILE                           │
  159. ;└─────────────────────────────────────────────────────────────────────────────┘
  160.            MOV     AH,3CH               ;
  161.            MOV     CX,20H               ;
  162.            MOV     DX,OFFSET FILENAME      ;
  163.            INT     21H               ;
  164.            JNC     COF100
  165.            MOV     DX,OFFSET CREATE_ERROR  ;
  166.            JMP     ERROR
  167. COF100:
  168.            MOV     HANDLE_OUT,AX
  169. ;┌─────────────────────────────────────────────────────────────────────────────┐
  170. ;│           READ PIC HEADER                               │
  171. ;└─────────────────────────────────────────────────────────────────────────────┘
  172.            MOV     AH,3FH
  173.            MOV     BX,HANDLE_IN
  174.            MOV     CX,13
  175.            MOV     DX,OFFSET CLP_PAC_SZ
  176.            INT     21H
  177. ;┌─────────────────────────────────────────────────────────────────────────────┐
  178. ;│           TRANSLATE TO IMG HEADER                           │
  179. ;└─────────────────────────────────────────────────────────────────────────────┘
  180.            MOV     AX,CLP_HEIGHT           ;GET PIC HEIGHT
  181.            MOV     IMG_HEIGHT,AX           ;MOV TO IMG HEIGHT
  182.            MOV     AX,CLP_WIDTH           ;GET PIC WIDTH
  183.            MOV     IMG_WIDTH,AX           ;MOV TO IMG WIDTH
  184.            XOR     DX,DX
  185.            DIV     EIGHT
  186.            CMP     DX,0
  187.            JE      TT100
  188.            INC     AX
  189. TT100:
  190.            MOV     IMG_WIDTH_BYTE,AX       ;
  191. ;┌─────────────────────────────────────────────────────────────────────────────┐
  192. ;│           WRITE IMG HEADER                            │
  193. ;└─────────────────────────────────────────────────────────────────────────────┘
  194.            MOV     AH,40H
  195.            MOV     BX,HANDLE_OUT
  196.            MOV     CX,44
  197.            MOV     DX,OFFSET IMG_NAME
  198.            INT     21H
  199. ;┌─────────────────────────────────────────────────────────────────────────────┐
  200. ;│           MOVE PICTURE DATA BETWEEN FILES                       │
  201. ;└─────────────────────────────────────────────────────────────────────────────┘
  202. READ_BLOCK:
  203.            CALL    PROCESS_PAC
  204. ;┌─────────────────────────────────────────────────────────────────────────────┐
  205. ;│           CLOSE FILES                               │
  206. ;└─────────────────────────────────────────────────────────────────────────────┘
  207. CLOSE_FILE:
  208.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  209.            MOV     AH,3EH               ;
  210.            INT     21H               ;
  211.            MOV     BX,HANDLE_OUT           ;CLOSE FILE
  212.            MOV     AH,3EH               ;
  213.            INT     21H               ;
  214.  
  215.            JMP     EXIT
  216. ERROR:
  217.            MOV     AX,CS
  218.            MOV     DS,AX
  219.            MOV     AH,9
  220.            INT     21H
  221. EXIT:
  222.            CALL    BREAK_OFF           ;BREAK KEY RESET
  223.            RET                   ;
  224. MAIN           ENDP
  225.  
  226. ;╔═════════════════════════════════════════════════════════════════════════════╗
  227. ;║ ░░░░░░░░░░░ PROCESS PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  228. ;╚═════════════════════════════════════════════════════════════════════════════╝
  229. PROCESS_PAC    PROC    NEAR
  230.  
  231.            CALL    READ_PAC
  232.            CALL    EXPAND_PAC
  233.            CALL    IMG_WRITE
  234.            RET
  235.  
  236. PROCESS_PAC    ENDP
  237. ;╔═════════════════════════════════════════════════════════════════════════════╗
  238. ;║ ░░░░░░░░░░░ READ PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  239. ;╚═════════════════════════════════════════════════════════════════════════════╝
  240. ;┌─────────────────────────────────────────────────────────────────────────────┐
  241. ;│           READ PACKET                               │
  242. ;└─────────────────────────────────────────────────────────────────────────────┘
  243. READ_PAC       PROC    NEAR
  244.  
  245.            PUSH    AX               ;SAVE REGISTERS
  246.            PUSH    BX               ;
  247.            PUSH    CX               ;
  248.            PUSH    DX               ;
  249.            PUSH    DS
  250.                            ;
  251.            MOV     AH,3FH               ;
  252.            MOV     BX,HANDLE_IN           ;
  253.            MOV     CX,CLP_PAC_SZ           ;
  254.            SUB     CX,13               ;NO NEED TO READ HEADER
  255.            LDS     DX,DISK_BUFFER           ;
  256.            INT     21H               ;
  257.                            ;
  258.            POP     DS
  259.            POP     DX               ;RESTORE REGISTERS
  260.            POP     CX               ;
  261.            POP     BX               ;
  262.            POP     AX               ;
  263.            RET
  264.  
  265. READ_PAC       ENDP
  266. ;╔═════════════════════════════════════════════════════════════════════════════╗
  267. ;║ ░░░░░░░░░░░ EXPAND PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  268. ;╚═════════════════════════════════════════════════════════════════════════════╝
  269. ;┌─────────────────────────────────────────────────────────────────────────────┐
  270. ;│           UNCOMPRESS PACKET                           │
  271. ;└─────────────────────────────────────────────────────────────────────────────┘
  272. EXPAND_PAC     PROC    NEAR
  273.  
  274.            PUSH    AX               ;SAVE REGISTERS
  275.            PUSH    BX               ;
  276.            PUSH    CX               ;
  277.            PUSH    DX               ;
  278.            PUSH    DI               ;
  279.            PUSH    SI               ;
  280.            PUSH    DS               ;
  281.            PUSH    ES               ;
  282.  
  283.            MOV     BX,CLP_PAC_SZ
  284.            SUB     BX,12               ;SUBTRACT HEADER
  285.            LES     DI,DISK_BUFFER           ;
  286.            ADD     DI,8000H            ;
  287.            LDS     SI,DISK_BUFFER           ;
  288. EP100:
  289.            LODSB
  290.            CMP     AL,CS:CLP_ID           ;START OF RUN?
  291.            JNE     EP700
  292.            LODSB
  293.            CMP     AL,0               ;16 BIT VALUE?
  294.            JNE     EP400               ;NO...BRANCH
  295.            LODSW                   ;GET WORD COUNT
  296.            MOV     CX,AX               ;SETUP COUNT REGISTER
  297.            LODSB                   ;GET DATA
  298.            REP     STOSB               ;
  299.            JMP     SHORT EP800
  300. EP400:
  301.            MOV     CL,AL               ;GET COUNT
  302.            XOR     CH,CH               ;
  303.            LODSB                   ;GET CHARACTER TO REPEAT
  304.            REP     STOSB               ;REPEAT CHARACTER
  305.            JMP     SHORT EP800           ;EXIT
  306. EP700:
  307.            STOSB                   ;STORE SINGLE CHARACTER
  308. EP800:
  309.            CMP     SI,BX
  310.            JNE     EP100               ;
  311.  
  312.            SUB     DI,8001H
  313.            MOV     CS:CLP_NORM,DI
  314.  
  315.            POP     ES               ;RESTORE REGISTERS
  316.            POP     DS               ;
  317.            POP     SI               ;
  318.            POP     DI               ;
  319.            POP     DX               ;
  320.            POP     CX               ;
  321.            POP     BX               ;
  322.            POP     AX               ;
  323.            RET
  324.  
  325. EXPAND_PAC     ENDP
  326. ;╔═════════════════════════════════════════════════════════════════════════════╗
  327. ;║ ░░░░░░░░░░░ IMAGE WRITE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  328. ;╚═════════════════════════════════════════════════════════════════════════════╝
  329. ;┌─────────────────────────────────────────────────────────────────────────────┐
  330. ;│           WRITE IMAGE FILE                            │
  331. ;└─────────────────────────────────────────────────────────────────────────────┘
  332. IMG_WRITE      PROC    NEAR
  333.  
  334.            PUSH    AX               ;SAVE REGISTERS
  335.            PUSH    BX               ;
  336.            PUSH    CX               ;
  337.            PUSH    DX               ;
  338.            PUSH    DS
  339.  
  340.            MOV     AH,40H               ;
  341.            MOV     BX,HANDLE_OUT           ;
  342.            MOV     CX,CLP_NORM           ;
  343.            LDS     DX,DISK_BUFFER           ;
  344.            ADD     DX,8000H
  345.            INT     21H               ;
  346.  
  347.            POP     DS
  348.            POP     DX               ;RESTORE REGISTERS
  349.            POP     CX               ;
  350.            POP     BX               ;
  351.            POP     AX               ;
  352.            RET
  353.  
  354. IMG_WRITE      ENDP
  355. ;┌─────────────────────────────────────────────────────────────────────────────┐
  356. ;└─────────────────────────────────────────────────────────────────────────────┘
  357. EOI          EQU      20H              ;END OF INTERRUPT
  358. BRKINT          EQU      1BH              ;BREAK INTERRUPT
  359. SAV_BRK       DW       ?
  360. ;╔═════════════════════════════════════════════════════════════════════════════╗
  361. ;║ ░░░░░░░░░░ BREAK_ON ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  362. ;╚═════════════════════════════════════════════════════════════════════════════╝
  363.           PUBLIC   BREAK_ON
  364. BREAK_ON      PROC     NEAR
  365.           PUSH     AX
  366.           PUSH     BX               ;SAVE REGISTERS
  367.           PUSH     CX               ;
  368.           PUSH     DX               ;
  369.           PUSH     SI               ;
  370.           PUSH     ES               ;
  371.  
  372.           XOR      BX,BX               ;SEGMENT 0
  373.           MOV      ES,BX               ;
  374.           MOV      SI,BRKINT*4           ;OFFSET OF INTERUPT VECTOR
  375.  
  376.           MOV      CX,ES:WORD PTR[SI]      ;OFFSET OF CURRENT VECT
  377.           MOV      DX,ES:WORD PTR[SI+2]    ;SEGMENT OF CURRENT VECT
  378.           MOV      CS:SAV_BRK,CX           ;SAVE OFFSET
  379.           MOV      CS:SAV_BRK+2,DX           ;SAVE SEGMENT
  380.  
  381.           MOV      AX,OFFSET BREAK           ;
  382.           CLI                   ;NO INTERRUPTS
  383.           MOV      ES:WORD PTR[SI],AX      ;SET OFFSET
  384.           MOV      AX,CS               ;SET THIS CODE SEGMENT
  385.           MOV      ES:WORD PTR[SI+2],AX    ;MOVE SEG ADDR TO INT.VECT
  386.           STI                   ;INTERRUPTS BACK ON
  387.  
  388.           POP      ES               ;RESTORE REGISTERS
  389.           POP      SI               ;
  390.           POP      DX               ;
  391.           POP      CX               ;
  392.           POP      BX               ;
  393.           POP      AX               ;
  394.           RET                   ;
  395. BREAK_ON      ENDP
  396. ;╔═════════════════════════════════════════════════════════════════════════════╗
  397. ;║ ░░░░░░░░░░ BREAK_OFF ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  398. ;╚═════════════════════════════════════════════════════════════════════════════╝
  399.           PUBLIC   BREAK_OFF
  400. BREAK_OFF     PROC     NEAR
  401.  
  402.           PUSH     AX               ;
  403.           PUSH     CX               ;
  404.           PUSH     DX               ;
  405.           PUSH     DI               ;
  406.           PUSH     ES               ;
  407.  
  408.           XOR      AX,AX               ;
  409.           MOV      ES,AX               ;SEGMENT 0
  410.           MOV      CX,CS:SAV_BRK           ;RESET VECTOR BACK TO OLD RTN
  411.           MOV      DX,CS:SAV_BRK+2           ;
  412.           MOV      DI,BRKINT*4           ;
  413.           CLI                   ;NO INTERRUPTS
  414.           MOV      ES:WORD PTR[DI],CX      ;
  415.           MOV      ES:WORD PTR[DI+2],DX    ;
  416.           STI                   ;INTERRUPTS BACK ON
  417.  
  418.           POP      ES               ;
  419.           POP      DI               ;
  420.           POP      DX               ;
  421.           POP      CX               ;
  422.           POP      AX               ;
  423.           RET                   ;
  424. BREAK_OFF     ENDP
  425. ;╔═════════════════════════════════════════════════════════════════════════════╗
  426. ;║ ░░░░░░░░░░ BREAK ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║ J
  427. ;╚═════════════════════════════════════════════════════════════════════════════╝
  428.           PUBLIC   BREAK
  429. BREAK          PROC     FAR
  430.  
  431.           MOV      AX,CS
  432.           MOV      DS,AX
  433.           MOV      AL,EOI               ;
  434.           OUT      020H,AL               ;
  435.           CALL     BREAK_OFF
  436.           MOV      SP,OFFSET STACK-4       ;
  437.           RET
  438.  
  439. BREAK          ENDP
  440. ;┌─────────────────────────────────────────────────────────────────────────────┐
  441. ;└─────────────────────────────────────────────────────────────────────────────┘
  442.            DB      64 DUP('STACK')
  443. STACK           EQU     $
  444. PROG_END       EQU     $
  445. CSEG           ENDS
  446.            END     MAIN
  447.